<?php

namespace App\Kuafu\Shop\Service\DouyinLibrary;

use GuzzleHttp\Exception\GuzzleException;

class DouyinWaiMaiService extends DouyinBaseService
{


    /**
     * 2.确认订单接口
     * 1. 用户下单后，第三方可调用此接口对抖音团购配送订单进行“接单”操作。
     * 2. 平台兜底策略：超10分钟未接单会自动取消订单。
     * @param string $orderId 订单id
     * @return mixed
     * @throws GuzzleException
     */
    public function confirmOrder(string $orderId)
    {
        $bizParam = [
            'order_id' => $orderId,
        ];
        $response = $this->doCurl('/goodlife/v1/trade/buy/merchant_confirm_order/', $bizParam, 'post');

        $format = self::commonReturn($response);
        return $format['oriData'];
    }

    /**
     * 3.拒绝接单接口
     * 用户下单后，第三方可调用此接口对抖音团购配送订单进行“拒单”操作
     * @param string $orderId 订单id
     * @param array $reason_code 拒单错误码，错误码必须在如下集合
     * @param string $desc 商家可填写的备注信息
     * @return mixed
     * @throws GuzzleException
     */
    public function merchantRejectOrder(string $orderId, array $reason_code, string $desc)
    {
        $bizParam = [
            'order_id'      => $orderId,
            "reject_reason" => [
                "reason_code" => $reason_code,
                "desc"        => $desc,
            ]
        ];
        $response = $this->doCurl('/goodlife/v1/after_sale/order/merchant_reject/', $bizParam, 'post');

        $format = self::commonReturn($response);
        return $format['oriData'];
    }

    /**
     * 4.商家取消订单接口
     * 1. 商家因联系不上用户、商品售完等原因需要主动退单，可调用此接口取消订单
     * @param string $orderId 订单id
     * @param string $outAfterSaleId 外部退款单ID
     * @param array $reason_code 取消错误码
     * @param string $desc 商家可填写的备注信息
     * @return mixed
     * @throws GuzzleException
     */
    public function applyRefundOrder(string $orderId, string $outAfterSaleId, array $reason_code, string $desc)
    {
        $bizParam = [
            'order_id'          => $orderId,
            "out_after_sale_id" => $outAfterSaleId,
            "refund_reason"     => [
                "reason_code" => $reason_code,
                "desc"        => $desc,
            ]
        ];
        $response = $this->doCurl('/goodlife/v1/after_sale/order/apply_refund/', $bizParam, 'post');

        $format = self::commonReturn($response);
        return $format['oriData'];
    }


    /**
     * 8.订单查询接口
     * 1. 服务商通过接口查询订单详情，支持三种查询方式：
     * （1）根据订单 id ，查询对应订单详情，入参：订单 id；
     * （2）根据订单状态和商户 id，查询指定时间内该商户下的订单列表，入参：商家id、订单状态、创单起止时间/修改起止时间；
     * （3）根据用户 id 和商户 id，查询某用户在该商户下的所有订单，入参：商家id、用户 id、创单起止时间/修改起止时间；
     * 2. 支付后未发码/发码失败订单查询方式：限定订单状态为“已支付”，如用户下单后超过 10 分钟未发码会发起退款；
     * 3. 退款申请待审核订单查询方式：限定券状态为“退款中”，如退款状态未响应超过 72 小时会自动退款。
     * 4. 金额计算公式：
     * 1. 原始金额 - 折扣金额（优惠金额） = 实付金额     original_amount - discount_amount = pay_amount
     * 2. 原始金额 = 各子单原始金额之和 （子单包含商品、配送费等）
     * @param array $param
     * @return mixed
     * @throws GuzzleException
     */
    public function queryOrder(array $param)
    {
        $response = $this->doCurl('/goodlife/v1/trade/order/query/', $param, 'get');

        return self::commonReturn($response);
    }

    /**
     * 10.商家同意/拒绝退款接口
     * 1. 收到用户申请退款的消息后，可在第三方系统中调用此接口进行异步处理，若拒绝退款，需要传拒绝原因。
     * @param string $afterSaleId 售后单ID
     * @param string $outAfterSaleId 外部售后单ID
     * @param string $accountId 商户ID
     * @param array $reason_code 拒绝退款错误码
     * @param string $desc 商家可填写的备注信息
     * @param bool $isApproved 是否审核通过
     * @return mixed
     * @throws GuzzleException
     */
    public function auditNotifyOrder(
        string $afterSaleId,
        string $outAfterSaleId,
        string $accountId,
        array $reason_code,
        string $desc,
        bool $isApproved
    ) {
        $bizParam = [
            "after_sale_id"     => $afterSaleId,
            "out_after_sale_id" => $outAfterSaleId,
            "is_approved"       => $isApproved,
            "account_id"        => $accountId,
            "reject_reason"     => [
                "reason_code" => $reason_code,
                "desc"        => $desc,
            ]
        ];
        $response = $this->doCurl('/goodlife/v1/after_sale/audit/notify/', $bizParam, 'post');

        $format = self::commonReturn($response);
        return $format['oriData'];
    }


    /**
     * 15.根据订单id查询结算明细
     * 1. 订单完成后才会生成分账明细，且可能存在延迟，查询时结果可能出现结果为空或数据不完整的情况
     * 1. 根据订单id查询订单分账明细，支持批量查询
     * 2. 此接口适用于技术服务商，不支持查询达人佣金、平台服务费等敏感数据
     * 3. 订单完成后才会生成分账信息，请勿提前查询
     * 4. 计算公式：
     * 1. 全推（平台配送）：实际订单扣完配送费商家赚的钱=商家货款-商家出配送费 -商家出小费（支付给平台）-商家对用户补贴（全推才减） = (...goods) - (...merchant_freight) - (...merchant_tip）- (...user_deliv_merchant_subsidy)
     * 2. 自配送：实际订单扣完配送费商家赚的钱=商家货款+用户支付配送费= (...goods) + （...user_deliv_coupon_pay）
     * @param string $accountId 分账商家id
     * @param string $orderIds 订单ids
     * @return mixed
     * @throws GuzzleException
     */
    public function settleLedgerQueryByOrder(string $orderIds, string $accountId = '')
    {
        $bizParam = [
            'account_id' => $accountId ?? DouyinBaseService::SAND_BOX_ACCOUNT_ID,
            'order_ids'  => $orderIds,
        ];
        $response = $this->doCurl('/goodlife/v1/settle/ledger/query_by_order/', $bizParam, 'get');

        $format = self::commonReturn($response);
        return $format['oriData'];
    }
}